package day4;

import java.util.Random;

//通过线程实现消费者和生产者购买商品的功能:
//定义一个类产品类：属性 产品名称   最大数量   当前数量
//       一个消费者线程类：属性 产品类对象
//       一个生产者线程类:  属性  产品类对象
//       一个测试类：初始化，运行
//要求:生产者线程，当 当前数量<最大数量时候.  生产者要进行生产.提示生产数量和当前数量
//        生产结束后,提示消费者可以购买
//        消费者线程, 消费者购买商品数量随机数而定，不能超过商品最大数量,如果购买数量大于商品当前数量.
//        需要提示 购买的数量，库存不足。   呼叫生产者开始生产物品
//        如果购买的商品数量小于商品当前数量则。正常购买 ，提示购买的数量和剩余数量
public class Work5 {
    public static void main(String[] args) {
        Goodz g=new Goodz("六味地黄丸",10,0);
        new Thread(new Consumer(g),"消费者").start();
        new Thread(new Product(g),"生产者").start();
    }
}
class Goodz{//商品类
    String name;//商品名
    int max;//最大数量
    int current;//库存
    public Goodz(String name, int max, int current) {
        this.name = name;
        this.max = max;
        this.current = current;
    }
}
//消费者线程, 消费者购买商品数量随机数而定，
// 不能超过商品最大数量,如果购买数量大于商品当前数量.
//        需要提示 购买的数量，库存不足。
//       唤醒等待 呼叫生产者开始生产物品
//        如果购买的商品数量小于商品当前数量则。
//        正常购买 ，提示购买的数量和剩余数量
class Consumer implements Runnable{//消费者线程
    Goodz g;//商品属性
    public Consumer(Goodz g) {
        this.g = g;
    }
    public void run() {
        String name=Thread.currentThread().getName();
        Random r=new Random();
        while(true){
            synchronized (g) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //定义购买商品随机数量不能超过最大值
                int num = r.nextInt(g.max);
                if(num==0){
                    System.out.println("不买了");
                    break;
                }
                if (num > g.current) { //购买的数量>当前库存
                    System.out.println(name + "购买" + num + "个"
                            + g.name + "而库存是" + g.current + "个,库存不足.");
                    //通知生产者 我自己需要等待
                    g.notifyAll();
                    try {
                        g.wait();//如果被人唤醒了 继续从它开始往下执行
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                g.current -= num; //更新库存
                System.out.println(name + "购买" + num + "个" + name
                        + "成功,当前库存:" + g.current);
            }
        }
    }
}
//生产者线程，当 当前数量<最大数量时候.
// 生产者要进行生产.提示生产数量和当前数量
//        生产结束后,提示消费者可以购买
class Product implements Runnable{//生产者线程
    Goodz g;//商品属性
    public Product(Goodz g) {
        this.g = g;
    }
    public void run() {
        String name=Thread.currentThread().getName();
        while(true){
            synchronized (g) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(g.current<g.max){  //库存小于最大值
                    System.out.println(name+"开始生产"+g.name
                            +",生产"+(g.max-g.current)+"个,库存"+g.max+"个");
                    g.current=g.max;  //更新库存
                    //唤醒对方购买 我等待
                    g.notifyAll();
                    try {
                        g.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}